#include "mem.h"
#include "FreeRTOS.h"
#include <string.h>
#include <stdio.h>

static void CheckMaxSizeLimit(size_t size)
{
    if(size >= MEM_MAX_LIMIT)
    {
        while(1)
        {
        }
    }
}

void *MemMalloc(size_t size)
{
    if(size == 0)
        return nullptr;
		
    CheckMaxSizeLimit(size);
    //printf("malloc size=%d\n", size);
    void *ptr = pvPortMalloc(size);
    if(ptr == nullptr)
    {
        //printf("malloc error, halt.");
        while(1)
        {

        }
    }
    
    return ptr;
}

void *MemCalloc(size_t number, size_t size)
{
    size_t len = number * size;
    if(len == 0)
        return nullptr;

    void *ptr = MemMalloc(len);
    if(ptr)
    {
        memset(ptr, 0, len);
    }

    return ptr;
}

void *MemRealloc(void * ptr , size_t newsize)
{   
    if(newsize == 0)
    {
        MemFree(ptr);
        return nullptr;
    }
   
    void *newPtr = MemMalloc(newsize);
    if(newPtr != nullptr && ptr != nullptr)
    {
        memcpy(newPtr, ptr, newsize);
        MemFree(ptr);
    }

    return newPtr;
}

void MemFree(void *ptr)
{
    if(ptr != nullptr)
    {
        // printf("free ptr=%d\n", (int)ptr);
        vPortFree(ptr);
    }
}

size_t MemGetFree()
{
    return xPortGetFreeHeapSize();
}

size_t MemGetMinFree()
{
    return xPortGetMinimumEverFreeHeapSize();
}
